package be.ipl.abeille.testNG;

import static org.testng.Assert.*;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import be.ipl.abeille.domaine.Const.Difficulte;
import be.ipl.abeille.domaine.Partie.EtatJeu;
import be.ipl.abeille.domaine.Joueur;
import be.ipl.abeille.domaine.Partie;
import be.ipl.abeille.exceptions.BizException;
import be.ipl.abeille.exceptions.PseudoExistantException;
import be.ipl.abeille.usecases.GestionJoueur;
import be.ipl.abeille.usecases.GestionPartie;
import be.ipl.abeille.usecases.GestionUnePartie;

public class Abeille_Tests1 {
	
	private static GestionJoueur gJoueur;
	private static GestionPartie gPartie;
	private static GestionUnePartie gUnePartie;
	
	private static List<Joueur> joueursInscrits;
	private static List<Joueur> joueursLoggues;
	
	private static List<Partie> partiesEnAttente;
	
	@BeforeClass
	public static void init(){

            Context jndi;
			try {
				jndi = new InitialContext();
	            gJoueur = (GestionJoueur) jndi
	                    .lookup("ejb:/Abeille_EJB/GestionJoueurImpl!be.ipl.abeille.usecases.GestionJoueur"); 
	            gPartie = (GestionPartie) jndi
	                    .lookup("ejb:/Abeille_EJB/GestionPartieImpl!be.ipl.abeille.usecases.GestionPartie");
	            gUnePartie = (GestionUnePartie) jndi
	                    .lookup("ejb:/Abeille_EJB/GestionUnePartieImpl!be.ipl.abeille.usecases.GestionUnePartie");
	            
	            joueursInscrits = new ArrayList<Joueur>();
	            joueursLoggues = new ArrayList<Joueur>();
	            
	            partiesEnAttente = new ArrayList<Partie>();
	            
	            Joueur j1 = new Joueur("Lionel", "a123456");
	            Joueur j2 = new Joueur("Antoine", "b123456");
	            Joueur j3 = new Joueur("Esteban", "c123456");
	            Joueur j4 = new Joueur("Denis", "d123456");
	            
	            joueursInscrits.add(j1);
	            joueursInscrits.add(j2);
	            joueursInscrits.add(j3);
	            joueursInscrits.add(j4);
	            
			} catch (NamingException e) {
				e.printStackTrace();
			}
	}
	
	@Test(groups = "inscription")
	public void testEnregistrerJoueurs() throws BizException{
		for(Joueur j : joueursInscrits){
				gJoueur.inscrire(j);
		}
	}
	
	@Test(groups = "inscriptionDoublon", dependsOnGroups = "inscription",expectedExceptions = PseudoExistantException.class)
	public void testInscriptionDoublon() throws BizException{
		gJoueur.inscrire(joueursInscrits.get(1));
	}
	
	@Test(groups= "login", dependsOnGroups = "inscription")
	public void testLoginJoueurs() throws  BizException{
		for(Joueur j : joueursInscrits){
			joueursLoggues.add(gJoueur.login(j.getPseudo(), j.getPassword()));
		}
	}
	
	@Test(groups= "login", dependsOnGroups = "inscription", expectedExceptions = BizException.class)
	public void testLoginJoueur1() throws  BizException{
		gJoueur.login("Lione", "a123456");
	}
	
	@Test(groups= "login", dependsOnGroups = "inscription", expectedExceptions = BizException.class)
	public void testLoginJoueur2() throws  BizException{
		gJoueur.login("azetq", "a123456");
	}
	
	@Test(groups= "login", dependsOnGroups = "inscription", expectedExceptions = BizException.class)
	public void testLoginJoueur3() throws  BizException{
		gJoueur.login("Lionel", "a12345");
	}
	
	@Test(groups= "login", dependsOnGroups = "inscription", expectedExceptions = BizException.class)
	public void testLoginJoueur4() throws  BizException{
		gJoueur.login("Denis", "a123456");
	}
	
	@Test(groups= "creationPartie", dependsOnGroups = "login")
	public void testCreationPartie1() throws BizException{
		Partie p = new Partie("partieDeTest", new GregorianCalendar(), Difficulte.FACILE);
		//p = gPartie.creer(p, joueursLoggues.get(0));
		partiesEnAttente.add(p);
		assertEquals(1, gPartie.listerPartiesDispo().size());
		gUnePartie.setPartie(p);
	}
	
	
	@Test(enabled=false, groups="creationPartie", dependsOnGroups = "login")
	public void testCreationPartie2() throws BizException{
		Context jndi;
		try {
			jndi = new InitialContext();
	        GestionUnePartie gestUnePartie = (GestionUnePartie) jndi
	                .lookup("ejb:/Abeille_EJB/GestionUnePartieImpl!be.ipl.abeille.usecases.GestionUnePartie");
	        
			Partie p = new Partie("partieDeTest2_timeout", new GregorianCalendar(), Difficulte.FACILE);
			//p = gPartie.creer(p, joueursLoggues.get(3));
			gestUnePartie.setPartie(p);
			Thread.currentThread().wait(35000);
			gestUnePartie.commencerPartie();
	        
		} catch (NamingException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        
	}
	
	@Test(groups= "rejoindrePartie", dependsOnGroups = "creationPartie")
	public void testRejoindrePartie1() throws BizException{
		Partie p = partiesEnAttente.get(0);
		for(int i = 1; i < joueursLoggues.size(); i++){
			gUnePartie.ajouterJoueur(joueursLoggues.get(i));
		}
	}
	
	@Test(groups = "quitterPartie", dependsOnGroups="rejoindrePartie")
	public void testQuitterPartie1() throws BizException{
		gUnePartie.supprimerJoueur(joueursLoggues.get(1));
	}
	
	@Test(groups = "quitterPartie", dependsOnGroups="rejoindrePartie")
	public void testQuitterPartie2() throws BizException{
		gUnePartie.supprimerJoueur(joueursLoggues.get(2));
		gUnePartie.supprimerJoueur(joueursLoggues.get(2));
	}
	
	@Test(groups = "debuterPartie", dependsOnGroups = "quitterPartie")
	public void testDebuterPartie1() throws BizException{
		gUnePartie.commencerPartie();
	}
	
		

}
